/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Client;

import Server.MailServer;
import java.util.List;
/**
 * @author VICTORIA
 * La clase MailClient es la encargada de la comunicacion/iteracion con el usuario
 * Su estructura esta dada por cuadro metodos base:
 * 1. El constructor
 * 2. El checkMessages
 * 3. readNextMessage
 * 4. El sendMessage
 */
public class MailClient {
        private String Nombre; //variable de instancia para guardar el valor de un objeto de otra clase
        private MailServer server; //instancia de la Clase MailServer
        
    /**
     *Constructor sin parametros de entrada
     */
    public MailClient(){
     
    }   
    /**
     *Constructor parametrizado 
     * @param Name
     * @param server
     */
    public MailClient(String Name,MailServer server) {
        Nombre=Name;
        this.server=server;
    }

    /**
     *Funcion checkMessages que devuelve la cantidad de mensajes que tiene un usuario en el servidor que fue logueado 
     * @return cantidad
     */
    public int checkMessages(){
     int cantidad=0;
     cantidad=server.getMessagesWaiting(Nombre); 
     return cantidad;
   }
    
    /**
     *Funcion que devuelve el Mensage siguiente de un usuario 
     * @return Message
     */
    public Message readNextMessage(){
     return server.getNextMessage(Nombre);     
    }

    /**
     *Procedimiento que envia un mensaje al servidor, utilizando procedimientos de las clases:
     * Message y MailServer
     * @param destinatario
     * @param asunto
     * @param contenido
     */
    public void sendMessage(String destinatario,String asunto,String contenido){
      if ((server.validarCliente(Nombre))&&(server.validarCliente(destinatario))){
          Message message = new Message(Nombre, destinatario, asunto, contenido);
          server.post(message);
      }
        
    }
    
    

    
    /**
     * Funcion Registrarse recibe como parametro el nombre de un Usuario y devuelve un boolean 
     * Si el usuario esta registrado devuelve un true sino False
     * @param usuario
     * @return
     */
    public boolean Registrarse(String usuario){
        if (!server.validarCliente(usuario)){
            this.Nombre=usuario;
            server.registrarCliente(Nombre);
            return true;
        }
        return false;
    }
    
    /**
     *Funcion que se encarga de dar de baja a un usuario en especifico,
     * recibe como parametro el nombre de un usuario
     * @param usuario
     * @return
     */
    public boolean DardeBaja(String usuario){
        if (server.validarCliente(usuario)){
            this.Nombre="";
            server.eliminarCliente(usuario);
            return true;
        }
        return false;
    }
    
    
    /**
     * Funcion Login que recibe como parametro el nombre de un usuario y valida si esta registrado en el servidor
     * @param usuario
     * @return
     */
    public boolean Login(String usuario){
        if (server.validarCliente(usuario)){
            this.Nombre=usuario;
            return true;
        }
        return false;
    }
    
    /**
     *Funcion getNewMessages sin parametros de entrada
     * Devuelve una lista de Mensajes de acuerdo al nombre de un usuario
     * @return
     */
    public String[][] getNewMessages(){
        List<Message> newMessages=server.getNewMessages(Nombre);
        return ListtoArray(newMessages);
    }

    /**
     * Funcion ListtoArray que recibe como parametro una lista de mensajes
     * devuelve una lista de mensajes
     */
    private String[][] ListtoArray(List<Message> Messages) {
        String[][] array=new String[Messages.size()][4];
        for (int indice=0;indice<Messages.size();indice++){        
            array[indice][0]=Messages.get(indice).Obtener_Remitente();
            array[indice][1]=Messages.get(indice).Obtener_Destinatorio();
            array[indice][2]=Messages.get(indice).Obtener_Asunto();
            array[indice][3]=Messages.get(indice).Obtener_Texto();
        }
        return array;
    }

    
    /**
     *Procedimiento ConectarServidor, recibe como parametro la direccion de un servidor
     * crea un nuevo servidor e importa la direccion del servidor
     * @param serverDirection
     */
    public void ConectarServidor(String serverDirection){
        server=new MailServer();
        server.importar(serverDirection);
    }
    
    /**
     *Procedimiento actualizarServidor recibe como parametro la direccion de un servidor
     * @param direccionServidor
     */
    public void actualizarServidor(String direccionServidor){
        server.exportar(direccionServidor);
        server.importar(direccionServidor);
    }
    
    /**
     *Procedimiento MarcarLeido, recibe como parametro el indice de un mensaje
     * Llama a un procedimiento de MailClient que recibe como parametro el nombre de usuario y el indice del mensaje
     * @param Mensaje
     */
    public void MarcarLeido(int Mensaje){
        server.LeerMensaje(Nombre, Mensaje);
    }
    
    /**
     *Procedimiento Eliminar mensaje, recibe como parametro el indice de una mensaje a se eliminado
     * @param Mensaje
     */
    public void EliminarMensaje(int Mensaje){
        server.eliminarMensaje(Nombre, Mensaje);
    }
    
    /**
     * Funcion getBandejaEntrada, devuelve una lista de Mensajes segun el nombre de usuario
     * @return
     */
    public String[][] getBandejaEntrada(){
        List<Message> allMessages=server.getAllMessages(Nombre);
        return ListtoArray(allMessages);
    }
    /**
     * Funcion getMensajeRemitente que recibe como parametro el remitente y devuelve una Lista de tipo String 
     * que tiene los mensajes filtrados por Remitente, llama a un metod del MailServer
     * @param remitente
     * @return
     */
    public String[][] getMensajeRemitente(String remitente){
       List<Message> mensajes=server.getMessagesSender(Nombre, remitente);
       return  ListtoArray(mensajes);
    }
}
